package aerolineas;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import asientos.Asiento;
import asientos.AsientoLanchita;
import asientos.ClaseDeAsiento;
import asientos.ClaseDeAsientoEjecutiva;
import asientos.ClaseDeAsientoIncorrectaException;
import asientos.ClaseDeAsientoPrimera;
import asientos.ClaseDeAsientoTurista;
import asientos.UbicacionesAsiento;
import asientos.UbicacionDeAsientoInexistenteException;
import busquedas.CriteriosBusqueda;

import despegar.utiles.Fecha;

/**
 * Con este adapter acomodamos la aerolinea lanchita a la interfaz que esperamos.
 */
public class LanchitaAdapter implements Aerolinea {
	
	private LanchitaWrapper aerolinea;
	private static BigDecimal PORCENTAJE_IMPUESTOS=new BigDecimal(0.15);
	
	public LanchitaAdapter() {
		this.aerolinea = LanchitaWrapper.getInstance();
	}
	
	@Override
	public String getNombre() {
		return NombresAerolineas.LANCHITA;
	}
	
	@Override
	public List<Asiento> asientosDisponibles(CriteriosBusqueda criterios) {
		List<Asiento> asientos = new ArrayList<Asiento>();
		
		String[][] asientosDisponibles=this.aerolinea.asientosDisponibles(
				criterios.getOrigen(), 
				criterios.getDestino(), 
				criterios.getFechaSalida().asString("lanchita"), 
				null, 
				null, 
				null);
		
		/* Devolvemos todos los asientos disponibles. */
		for(String[] unAsiento : asientosDisponibles) {
			asientos.add(new AsientoLanchita(
					this.aerolinea,
					unAsiento[8], // origen
					unAsiento[9], // destino
					new Fecha(unAsiento[10]), // Fecha de salida
					new Fecha(unAsiento[11]), // Fecha de llegada
					unAsiento[6],		 // Hora de salida
					unAsiento[7],		 // Hora de llegada
					unAsiento[0],		 // C�digo de asiento
					new BigDecimal(unAsiento[1]).add(new BigDecimal(unAsiento[1]).multiply(PORCENTAJE_IMPUESTOS).setScale(2,BigDecimal.ROUND_UP)), //Precio de la aerolinea + el impuesto
					this.createClaseDeAsiento(unAsiento[2]), // Clase de asiento
					this.createUbicacion(unAsiento[3]), // ubicaci�n
					unAsiento[4])); // estado
		}
		
		return asientos;
	}

	private UbicacionesAsiento createUbicacion(String ubicacion) {
		if(ubicacion.equals("V")) {
			return UbicacionesAsiento.VENTANA;
		}
		else if(ubicacion.equals("P")) {
			return UbicacionesAsiento.PASILLO;
		}
		else if(ubicacion.equals("C")) {
			return UbicacionesAsiento.CENTRO;
		}
		throw new UbicacionDeAsientoInexistenteException(ubicacion);
	}

	private ClaseDeAsiento createClaseDeAsiento(String clase) {
		if (clase.equals("T")) {
			return new ClaseDeAsientoTurista();
		}
		else if (clase.equals("E")) {
			return new ClaseDeAsientoEjecutiva();
		}
		else if (clase.equals("P")) {
			return new ClaseDeAsientoPrimera();
		}
		else {
			throw new ClaseDeAsientoIncorrectaException();			
		}
	}
}
